#include "gite.h"
#include "../lib/timer0.h"
#include "accelero.h"
#include <math.h>
#include <stdio.h>

#define PI_180 57.295779513082320876798154814105
#define Y_THRESHHOLD	5

#define ATTENTE_ALERTE 100

void (*p_alerte)()=0; //pointeur sur la fonction d'alerte a executer
int angle;



void Init_Gite()
{
	//init l'accelero (init ADC)
	Init_Accelero();

}



//regarde toutes les mili par defaut
void Surveille_Gite(int nvo_inter,int angle_alerte,void (*fonc_alerte))
{
	//sauve la fonction et l'angle pour les avoir en global
 	p_alerte=(void*)fonc_alerte;
	angle=angle_alerte;
	
	//lance l'init du timer qui va lancer inter_acce toutes les periode
	init_timer0_periode(7,1000,nvo_inter,(void *)Teste_Gite_Timer);

}



void Surveille_Gite_Custom_Periode(int resolution, long periode, int nvo_inter,int angle_alerte,void (*fonc_alerte))
{
	//sauve la fonction et l'angle pour les avoir en global
	p_alerte=(void*)fonc_alerte;
	angle=angle_alerte;
		
	//lance l'init du timer qui va lancer inter_acce toutes les periode
	init_timer0_periode(resolution,periode, nvo_inter,(void *)Teste_Gite_Timer);

}

void Surveille_Gite_Custom_Reload(int resolution,int reload,int nvo_inter,int angle_alerte,void (*fonc_alerte))
{
	//sauve la fonction et l'angle pour les avoir en global
	p_alerte=(void*)fonc_alerte;
	angle=angle_alerte;
		
	//lance l'init du timer qui va lancer inter_acce toutes les periode
	init_timer0_reload(resolution,reload,nvo_inter,(void *)Teste_Gite_Timer);

}

int Teste_Gite_Sequenceur()
{
	int x,y;
	int resa;
	
	static compteur=0;

	y=Lire_Accelero_y();
	x=Lire_Accelero_x();

	//resa=Calcul_Angle(x-283,y-305);  ->normalement c'est corrige dans l'offset de l'accelero, voir accelero.h

	resa=Calcul_Angle(x,y);

	//si alerte
	if(resa>angle || resa <(-angle) )
	{	
		compteur=ATTENTE_ALERTE;
		return 0;		
	}
	else if(compteur==0)
		return 1;
	else
	{
		compteur--;
		return 0;
	}
	

}


void Teste_Gite_Timer()//	fonction executee toutes les x micro secondes par le timer0
{
	int x,y;
	int resa;
//	int i,j;

	y=Lire_Accelero_y();
	x=Lire_Accelero_x();

	
	//printf("x:%d y:%d \n",x,y);
	//for(i=0;i<65000;i++)
	//for(j=0;j<10;j++);

	resa=Calcul_Angle(x-283,y-305);

	//printf("angle: %i \n",resa);

	//si alerte
	if(resa>angle || resa <(-angle) )
	{
		//execute la fonction d'alerte
			if(p_alerte!=0)	  //au cas ou...
			{
				//exectute la fonction d'alerte
			    (*p_alerte)();
			}
			else
			{
				 //ecrire erreur sur sortie
			}
	}

}

//calcule l'angle de rotation a partir de l'acceleration sur x et y en considerant Ox=Oy et yz fixe (pas de vague)
int Calcul_Angle(int x,int y)
{
	//on calcule l'angle avec la tangente de (y/x)
	float teta;
	
	if(y<=Y_THRESHHOLD && y>=-Y_THRESHHOLD)
	{
		if(y>0)
			return 90;	// si y est trop petit, l'angle vaut 0 degres
	 	else
			return -90;
	}
	else	
	{
		teta=atan(((float)x)/y)*PI_180;
		// teste le signe de y pour reguler l'angle
		if (y<0)
			return -teta;
		else
			return teta;
	}		

}

